/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef IDISCRETEOBJECT_H
#define IDISCRETEOBJECT_H

#include <vector>

#include "IConfigurable.h"

// Przestrzeń nazw
namespace RafMat
{
namespace SimInterface
{

// Deklaracje zapowiadająće
class IDiscreteObject;

/** Alias na typ zręcznego wskaźnika na obiekty IDiscreteObject */
typedef boost::shared_ptr<IDiscreteObject> IDiscreteObjectSPtr;

/**
    Interfejs pozwalający na edycję obiektu dyskretnego ARX.

    Interfejs ten powstał ze względu na złożoność konfiguracji obiektów ARX
    (interfejs IConfigurable nie wystarcza).

    Interfejs pozwala na odczyt zestawów parametrów obiektu ARX. Możliwe jest
    dodawanie i usuwanie tychże zestawów. Dodane zestawy parametrów można
    modyfikować wg zwygłego interfejsu IConfigurable, jak większość innych
    obiektów. Dodatkowo udostępniona została metoda updateParameters, która
    wymusza na obiekcie ARX uporządkowanie listy parametrów na potrzeby
    wewnętrznego algorytmu.
*/
class IDiscreteObject
{
 public:

    enum NonlinearityType
    {
        NonlinearityNone,
        NonlinearityNLSaturation
    };

    /**
        Wstawia nowy zestaw parametrów modelu ARX.

        Funkcja wewnętrznie tworzy nową instancję obiektu DiscreteObjectParams
        i przypisuje mu przesłane parametry. Funkcja zwraca obiekt konfiguracyjny
        dla wspomnianej instancji, dzięki czemu istnieje możliwość jej modyfikacji.

        \param [in] a Mianownik transmitancji (wektor [a0 a1 ... a_dA]).
        \param [in] b Licznik transmitancji (wektor [b0 b1 ... b_dB]).
        \param [in] delay Wartość opóźnienia w próbkach.
        \param [in] switchTime Czas przełączenia parametrów. Wartość niedodatnia
        oznacza trwałe parametry dla modeli stacjonarnych.
        \return Obiekt konfiguracyjny dla nowopowstałego zestawu parametrów.
    */
    virtual IConfigurableSPtr insertParameters(std::vector<double> a,  std::vector<double> b, std::vector<double> c,std::vector<double> ag,
                                 double d = 0, unsigned int delay = 0, int switchTime = -1) = 0;


    //virtual void setNonlinearity(NonlinearityType nlType) = 0;

    /**
        Usuwa zestaw parametrów modelu ARX.
        Parametry do usunięcia są rozpoznawane poprzez obiekt konfiguracyjny.

        \param [in] paramSet Parametry do usunięcia.
    */
    virtual void deleteParameters(IConfigurableSPtr paramSet) = 0;

    /**
        Odświeża listę parametrów w obiekcie ARX.
        Metoda wymusza na obiekcie przeliczenie kolejności doboru parametrów
        (istotne przy modelach niestacjonarnych).
    */
    virtual void updateParameters() = 0;

    /**
        Zwraca aktualną listę konfiguracji zestawów parametrów.
    */
    virtual std::vector<IConfigurableSPtr> getParameters() const = 0;
};

}   // SimInterface namespace
}   // RafMat namespace

#ifndef __MEX_COMPILER
Q_DECLARE_METATYPE(RafMat::SimInterface::IDiscreteObjectSPtr)
#endif

#endif // IDISCRETEOBJECT_H
